# -*- coding: utf-8 -*-
"""
校验相关API接口模块

包含校验结果推送、错误日志管理、校验总结等功能接口
"""

from datetime import datetime

from flask import Blueprint, request, jsonify

# 创建蓝图
校验接口蓝图 = Blueprint('校验接口', __name__, url_prefix='/api/validation')


def 初始化校验接口(执行总结字典, 执行总结锁, 校验错误信息列表, 
                   日志记录器, 获取用户缓存, 总结校验未通过项目_rich):
    """
    初始化校验接口，注入依赖
    """
    global _执行总结字典, _执行总结锁, _校验错误信息列表
    global _日志记录器, _获取用户缓存, _总结校验未通过项目_rich

    _执行总结字典 = 执行总结字典
    _执行总结锁 = 执行总结锁
    _校验错误信息列表 = 校验错误信息列表
    _日志记录器 = 日志记录器
    _获取用户缓存 = 获取用户缓存
    _总结校验未通过项目_rich = 总结校验未通过项目_rich


@校验接口蓝图.route('/推送校验结果', methods=['POST'])
def 推送校验结果接口():
    """
    推送校验结果接口

    功能:
        接收OCR程序推送的校验结果，并存储到执行总结字典中

    请求体:
        JSON格式，包含单据号、校验结果等信息

    返回:
        操作结果的JSON响应
    """
    try:
        请求数据 = request.get_json()
        if not 请求数据:
            return jsonify({"错误": "请求体不能为空"}), 400

        # 验证必需参数
        if '单据号' not in 请求数据:
            return jsonify({"错误": "缺少必需参数: 单据号"}), 400

        单据号 = 请求数据['单据号']
        校验结果 = 请求数据.get('校验结果', {})
        详细错误信息 = 请求数据.get('详细错误信息', [])  # 获取详细错误信息
        推送时间 = 请求数据.get('推送时间', datetime.now().isoformat())

        # 解析任务编号，兼容多种字段名
        任务编号 = (
                请求数据.get('任务编号') or 请求数据.get('task_id') or 请求数据.get('taskId')
                or request.args.get('任务编号') or request.args.get('task_id') or request.args.get('taskId')
        )

        # 获取用户名字段
        用户名 = 请求数据.get('用户名') or 请求数据.get('user_name') or 请求数据.get('username')



        # 存储校验结果到执行总结字典（内存缓存）
        with _执行总结锁:
            _执行总结字典[单据号] = {
                "单据号": 单据号,
                "校验结果": 校验结果,
                "详细错误信息": 详细错误信息,  # 保存详细错误信息
                "推送时间": 推送时间,
                "类型": "校验结果推送",
                "状态": "已推送",
                "用户名": 用户名,
                "任务编号": 任务编号,
            }


        _日志记录器.info(
            f"成功接收校验结果推送: {单据号}，包含 {len(详细错误信息)} 条详细错误信息")

        return jsonify({
            "状态": "成功",
            "消息": f"校验结果已接收: {单据号}",
            "时间戳": datetime.now().isoformat()
        })

    except Exception as 异常:
        _日志记录器.error(f"推送校验结果失败: {异常}")
        return jsonify({"错误": f"推送校验结果失败: {str(异常)}"}), 500


@校验接口蓝图.route('/获取错误日志', methods=['GET'])
def 获取错误日志接口():
    """
    获取错误日志接口
    
    功能:
        返回系统收集的校验错误日志信息
    
    返回:
        包含错误日志列表的JSON响应
    """
    try:
        # 获取校验错误信息列表
        错误日志列表 = []
        for 错误信息 in _校验错误信息列表:
            错误日志列表.append({
                "时间": datetime.now().isoformat(),
                "类型": "校验错误",
                "错误信息": 错误信息,
                "详细信息": 错误信息
            })

        return jsonify({
            "状态": "成功",
            "错误日志": 错误日志列表,
            "总数量": len(错误日志列表),
            "时间戳": datetime.now().isoformat()
        })

    except Exception as 异常:
        _日志记录器.error(f"获取错误日志失败: {异常}")
        return jsonify({"错误": f"获取错误日志失败: {str(异常)}"}), 500


@校验接口蓝图.route('/获取校验错误总结', methods=['GET'])
def 获取校验错误总结接口():
    """
    获取校验错误总结接口
    
    功能:
        返回校验未通过项目的总结信息
    
    参数:
        单据号 (可选): URL参数，如果不提供则使用"未知单据"
    
    返回:
        包含校验错误总结的JSON响应
    """
    try:
        # 从请求参数中获取单据号，如果没有提供则使用默认值
        单据号 = request.args.get('单据号', '未知单据')

        # 调用总结函数，传入单据号参数
        校验总结 = _总结校验未通过项目_rich(单据号)

        return jsonify({
            "状态": "成功",
            "单据号": 单据号,
            "校验总结": 校验总结,
            "校验错误列表": _校验错误信息列表,
            "时间戳": datetime.now().isoformat()
        })

    except Exception as 异常:
        _日志记录器.error(f"获取校验错误总结失败: {异常}")
        return jsonify({"错误": f"获取校验错误总结失败: {str(异常)}"}), 500


@校验接口蓝图.route('/清空错误日志', methods=['POST'])
def 清空错误日志接口():
    """
    清空错误日志接口
    
    功能:
        清空系统收集的错误日志信息
    
    返回:
        清空操作结果的JSON响应
    """
    try:
        _校验错误信息列表.clear()
        return jsonify({
            "状态": "成功",
            "消息": "错误日志已清空",
            "时间戳": datetime.now().isoformat()
        })
    except Exception as 异常:
        _日志记录器.error(f"清空错误日志失败: {异常}")
        return jsonify({"错误": f"清空错误日志失败: {str(异常)}"}), 500